From 68cfb8063118420dfaf38907460f70e3a7a6aa7b Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 8 Jan 2012 02:41:30 +0100 Subject: [PATCH] themingengine: Split out the border drawing function --- gtk/gtkthemingengine.c | 209 ++++++++++++++++++++++------------------- 1 file changed, 111 insertions(+), 98 deletions(-) diff --git a/gtk/gtkthemingengine.c b/gtk/gtkthemingengine.c index 149c5b3534..b09b8d497f 100644 --- a/gtk/gtkthemingengine.c +++ b/gtk/gtkthemingengine.c @@ -1587,85 +1587,15 @@ render_frame_stroke (cairo_t *cr, } static void -render_frame_internal (GtkThemingEngine *engine, - cairo_t *cr, - gdouble x, - gdouble y, - gdouble width, - gdouble height, - guint hidden_side, - GtkJunctionSides junction) +render_border (cairo_t *cr, + GtkRoundedBox *border_box, + GtkBorder *border, + guint hidden_side, + GdkRGBA colors[4], + GtkBorderStyle border_style[4]) { - GtkStateFlags state; - GtkBorderStyle border_style[4]; - GtkRoundedBox border_box; - gdouble progress; - gboolean running; - GtkBorder border; - GdkRGBA *alloc_colors[4]; - GdkRGBA colors[4]; guint i, j; - state = gtk_theming_engine_get_state (engine); - - gtk_theming_engine_get_border (engine, state, &border); - gtk_theming_engine_hide_border_sides (&border, hidden_side); - - gtk_theming_engine_get (engine, state, - "border-top-style", &border_style[0], - "border-right-style", &border_style[1], - "border-bottom-style", &border_style[2], - "border-left-style", &border_style[3], - "border-top-color", &alloc_colors[0], - "border-right-color", &alloc_colors[1], - "border-bottom-color", &alloc_colors[2], - "border-left-color", &alloc_colors[3], - NULL); - - running = gtk_theming_engine_state_is_running (engine, GTK_STATE_PRELIGHT, &progress); - - if (running) - { - GtkStateFlags other_state; - GdkRGBA *other_colors[4]; - - if (state & GTK_STATE_FLAG_PRELIGHT) - { - other_state = state & ~(GTK_STATE_FLAG_PRELIGHT); - progress = 1 - progress; - } - else - other_state = state | GTK_STATE_FLAG_PRELIGHT; - - gtk_theming_engine_get (engine, other_state, - "border-top-color", &other_colors[0], - "border-right-color", &other_colors[1], - "border-bottom-color", &other_colors[2], - "border-left-color", &other_colors[3], - NULL); - - for (i = 0; i < 4; i++) - { - colors[i].red = CLAMP (alloc_colors[i]->red + ((other_colors[i]->red - alloc_colors[i]->red) * progress), 0, 1); - colors[i].green = CLAMP (alloc_colors[i]->green + ((other_colors[i]->green - alloc_colors[i]->green) * progress), 0, 1); - colors[i].blue = CLAMP (alloc_colors[i]->blue + ((other_colors[i]->blue - alloc_colors[i]->blue) * progress), 0, 1); - colors[i].alpha = CLAMP (alloc_colors[i]->alpha + ((other_colors[i]->alpha - alloc_colors[i]->alpha) * progress), 0, 1); - gdk_rgba_free (other_colors[i]); - gdk_rgba_free (alloc_colors[i]); - } - } - else - { - for (i = 0; i < 4; i++) - { - colors[i] = *alloc_colors[i]; - gdk_rgba_free (alloc_colors[i]); - } - } - - _gtk_rounded_box_init_rect (&border_box, x, y, width, height); - _gtk_rounded_box_apply_border_radius (&border_box, engine, state, junction); - cairo_save (cr); cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); @@ -1702,7 +1632,7 @@ render_frame_internal (GtkThemingEngine *engine, dont_draw |= (1 << j); } - render_frame_stroke (cr, &border_box, &border, colors, dont_draw, border_style[i]); + render_frame_stroke (cr, border_box, border, colors, dont_draw, border_style[i]); } break; case GTK_BORDER_STYLE_DOUBLE: @@ -1718,19 +1648,19 @@ render_frame_internal (GtkThemingEngine *engine, else dont_draw |= (1 << j); } - other_border.top = (border.top + 2) / 3; - other_border.right = (border.right + 2) / 3; - other_border.bottom = (border.bottom + 2) / 3; - other_border.left = (border.left + 2) / 3; + other_border.top = (border->top + 2) / 3; + other_border.right = (border->right + 2) / 3; + other_border.bottom = (border->bottom + 2) / 3; + other_border.left = (border->left + 2) / 3; - render_frame_fill (cr, &border_box, &other_border, colors, dont_draw); + render_frame_fill (cr, border_box, &other_border, colors, dont_draw); - other_box = border_box; + other_box = *border_box; _gtk_rounded_box_shrink (&other_box, - border.top - other_border.top, - border.right - other_border.right, - border.bottom - other_border.bottom, - border.left - other_border.left); + border->top - other_border.top, + border->right - other_border.right, + border->bottom - other_border.bottom, + border->left - other_border.left); render_frame_fill (cr, &other_box, &other_border, colors, dont_draw); } case GTK_BORDER_STYLE_GROOVE: @@ -1754,21 +1684,21 @@ render_frame_internal (GtkThemingEngine *engine, else dont_draw |= (1 << j); } - other_border.top = border.top / 2; - other_border.right = border.right / 2; - other_border.bottom = border.bottom / 2; - other_border.left = border.left / 2; + other_border.top = border->top / 2; + other_border.right = border->right / 2; + other_border.bottom = border->bottom / 2; + other_border.left = border->left / 2; - render_frame_fill (cr, &border_box, &other_border, colors, dont_draw); + render_frame_fill (cr, border_box, &other_border, colors, dont_draw); - other_box = border_box; + other_box = *border_box; _gtk_rounded_box_shrink (&other_box, other_border.top, other_border.right, other_border.bottom, other_border.left); - other_border.top = border.top - other_border.top; - other_border.right = border.right - other_border.right; - other_border.bottom = border.bottom - other_border.bottom; - other_border.left = border.left - other_border.left; + other_border.top = border->top - other_border.top; + other_border.right = border->right - other_border.right; + other_border.bottom = border->bottom - other_border.bottom; + other_border.left = border->left - other_border.left; render_frame_fill (cr, &other_box, &other_border, other_colors, dont_draw); } break; @@ -1778,11 +1708,94 @@ render_frame_internal (GtkThemingEngine *engine, } } - render_frame_fill (cr, &border_box, &border, colors, hidden_side); + render_frame_fill (cr, border_box, border, colors, hidden_side); cairo_restore (cr); } +static void +render_frame_internal (GtkThemingEngine *engine, + cairo_t *cr, + gdouble x, + gdouble y, + gdouble width, + gdouble height, + guint hidden_side, + GtkJunctionSides junction) +{ + GtkStateFlags state; + GtkBorderStyle border_style[4]; + GtkRoundedBox border_box; + gdouble progress; + gboolean running; + GtkBorder border; + GdkRGBA *alloc_colors[4]; + GdkRGBA colors[4]; + guint i; + + state = gtk_theming_engine_get_state (engine); + + gtk_theming_engine_get_border (engine, state, &border); + gtk_theming_engine_hide_border_sides (&border, hidden_side); + + gtk_theming_engine_get (engine, state, + "border-top-style", &border_style[0], + "border-right-style", &border_style[1], + "border-bottom-style", &border_style[2], + "border-left-style", &border_style[3], + "border-top-color", &alloc_colors[0], + "border-right-color", &alloc_colors[1], + "border-bottom-color", &alloc_colors[2], + "border-left-color", &alloc_colors[3], + NULL); + + running = gtk_theming_engine_state_is_running (engine, GTK_STATE_PRELIGHT, &progress); + + if (running) + { + GtkStateFlags other_state; + GdkRGBA *other_colors[4]; + + if (state & GTK_STATE_FLAG_PRELIGHT) + { + other_state = state & ~(GTK_STATE_FLAG_PRELIGHT); + progress = 1 - progress; + } + else + other_state = state | GTK_STATE_FLAG_PRELIGHT; + + gtk_theming_engine_get (engine, other_state, + "border-top-color", &other_colors[0], + "border-right-color", &other_colors[1], + "border-bottom-color", &other_colors[2], + "border-left-color", &other_colors[3], + NULL); + + for (i = 0; i < 4; i++) + { + colors[i].red = CLAMP (alloc_colors[i]->red + ((other_colors[i]->red - alloc_colors[i]->red) * progress), 0, 1); + colors[i].green = CLAMP (alloc_colors[i]->green + ((other_colors[i]->green - alloc_colors[i]->green) * progress), 0, 1); + colors[i].blue = CLAMP (alloc_colors[i]->blue + ((other_colors[i]->blue - alloc_colors[i]->blue) * progress), 0, 1); + colors[i].alpha = CLAMP (alloc_colors[i]->alpha + ((other_colors[i]->alpha - alloc_colors[i]->alpha) * progress), 0, 1); + gdk_rgba_free (other_colors[i]); + gdk_rgba_free (alloc_colors[i]); + } + } + else + { + for (i = 0; i < 4; i++) + { + colors[i] = *alloc_colors[i]; + gdk_rgba_free (alloc_colors[i]); + } + } + + _gtk_rounded_box_init_rect (&border_box, x, y, width, height); + _gtk_rounded_box_apply_border_radius (&border_box, engine, state, junction); + + render_border (cr, &border_box, &border, hidden_side, colors, border_style); +} + static void gtk_theming_engine_render_frame (GtkThemingEngine *engine, cairo_t *cr, -- 2.30.2